# dev.setupMiddlewares

- **类型：**

```ts
type SetupMiddlewaresServer = {
  sockWrite: (
    type: string,
    data?: string | boolean | Record<string, any>,
  ) => void;
  environments: EnvironmentAPI;
};

type SetupMiddlewares = Array<
  (
    middlewares: {
      unshift: (...handlers: RequestHandler[]) => void;
      push: (...handlers: RequestHandler[]) => void;
    },
    server: SetupMiddlewaresServer,
  ) => void
>;
```

- **默认值：** `undefined`

提供执行自定义函数和应用自定义中间件的能力。

> 查看 [开发服务器 - 中间件](/guide/basic/server#中间件) 了解更多。

## 执行顺序

中间件的执行顺序是: `unshift` => 内置中间件 => `push`。

```ts title="rsbuild.config.ts"
export default {
  dev: {
    setupMiddlewares: [
      (middlewares, server) => {
        middlewares.unshift((req, res, next) => {
          console.log('first');
          next();
        });

        middlewares.push((req, res, next) => {
          console.log('last');
          next();
        });
      },
    ],
  },
};
```

## Server API

在 `setupMiddlewares` 函数中，你可以访问到 `server` 对象，该对象提供了一些服务器 API。

### environments

提供 Rsbuild 的 [environment API](/api/javascript-api/environment-api#environment-api)，详见 [Dev server API - environments](/api/javascript-api/dev-server-api#environments)。

```ts title="rsbuild.config.ts"
export default {
  dev: {
    setupMiddlewares: [
      (middlewares, { environments }) => {
        middlewares.unshift(async (req, _res, next) => {
          const webStats = await environments.web.getStats();
          console.log(webStats.toJson({ all: false }));
          next();
        });
      },
    ],
  },
};
```

### sockWrite

向 HMR 客户端传递一些消息，详见 [Dev server API - sockWrite](/api/javascript-api/dev-server-api#sockwrite)。

例如，如果你发送一个 `'static-changed'` 的消息，页面将会重新加载。

```ts title="rsbuild.config.ts"
export default {
  dev: {
    setupMiddlewares: [
      (middlewares, { sockWrite }) => {
        if (someCondition) {
          sockWrite('static-changed');
        }
      },
    ],
  },
};
```
